package fachadas;

import java.util.List;
import java.util.Iterator;
import entidades.Alocavel;
import entidades.Escalonavel;
import entidades.Gerenciador;

/**
 * Implementa��o do padr�o Fa�ade
 * Classe para mediar o contato entre a Interface Usuario e o Gerenciador da camada de negocio.
 * Esta Fachada tamb�m possui um contato com a PersistenciaFacade para carregar o Gerenciador que foi salvo e para zerar a persistencia.
 * @author Tales
 *
 */

public class UserInterfaceFacade {
	
	private Gerenciador ger;
	/**
	 * O construtor possui apenas a chamada pro initSystem() para carregar ou criar o Gerenciador da camada de negocios.
	 */
	public UserInterfaceFacade() {
		ger = initSystem();
	}

	/**
	 * Redireciona pro Gerenciador a requisi��o para criar uma sala.
	 * @param id
	 * @param capacidade
	 * @param finalidade
	 * @param tipo
	 * @throws Exception
	 */
	public void adicionarSala(String id, int capacidade, String finalidade,
			String tipo) throws Exception {
		//System.out.println(id + capacidade + finalidade + tipo);
		ger.adicionarSala(id, capacidade, finalidade, tipo);
	}

	/**
	 * Redireciona pro Gerenciador a requisi��o para criar uma sala.
	 * @param id
	 * @param capacidade
	 * @param finalidade
	 * @param tipo
	 * @param apelido
	 * @throws Exception
	 */
	public void adicionarSala(String id, int capacidade, String finalidade,
			String tipo, String apelido) throws Exception {
		ger.adicionarSala(id, capacidade, finalidade, tipo, apelido);
	}

	/**
	 * Redireciona pro Gerenciador a requisi��o para criar uma sala.
	 * @param id
	 * @param capacidade
	 * @param finalidade
	 * @param tipo
	 * @param apelido
	 * @param aberto
	 * @throws Exception
	 */
	public void adicionarSala(String id, int capacidade, String finalidade,
			String tipo, String apelido, boolean aberto) throws Exception {
		ger.adicionarSala(id, capacidade, finalidade, tipo, apelido, aberto);
	}

	/**
	 * Redireciona pro Gerenciador a requisi��o para criar um evento.
	 * @param id
	 * @param nome
	 * @param inicio
	 * @param fim
	 * @param area
	 * @param contato
	 * @throws Exception
	 */
	public void adicionarEvento(String id, String nome, String inicio,
			String fim, String area, String contato) throws Exception {
		ger.adicionarEvento(id, nome, inicio, fim, area, contato);
	}

	/**
	 * Redireciona pro Gerenciador a requisi��o para criar um evento.
	 * @param id
	 * @param nome
	 * @param inicio
	 * @param fim
	 * @param area
	 * @param contato
	 * @param repeticoes
	 * @throws Exception
	 */
	public void adicionarEvento(String id, String nome, String inicio,
			String fim, String area, String contato, int repeticoes)
			throws Exception {
		ger.adicionarEvento(id, nome, inicio, fim, area, contato, repeticoes);
	}

	/**
	 * Redireciona pro Gerenciador a requisi��o para criar um evento.
	 * @param idEvento
	 * @param idSala
	 * @throws Exception
	 */
	public void alocarEvento(String idEvento, String idSala) throws Exception {
		ger.alocarEvento(idEvento, idSala);
	}

	/**
	 * Encaminha a localiza��o de um evento para o Gerenciador da camada de negocios.
	 * @param atributo
	 * @param valor
	 * @return
	 * @throws Exception
	 */
	public String localizarEvento(String atributo, String valor)
			throws Exception {
		return ger.localizarEvento(atributo, valor);
	}

	/**
	 * Encaminha a requisi��o para cancelar um evento para o Gerenciador de negocios.
	 * @param id
	 * @throws Exception
	 */
	public void cancelarEvento(String id) throws Exception {
		ger.cancelarEvento(id);
	}

	/**
	 * Encaminha a requisi��o para desalocar um evento para o Gerenciador de neg�cios.
	 * @param id
	 * @throws Exception
	 */
	public void desalocarEvento(String id) throws Exception {
		ger.desalocarEvento(id);
	}

	/**
	 * Encaminha a requisi��o de remo�ao de sala para o Gerenciador
	 * @param id
	 * @throws Exception
	 */
	public void removerSala(String id) throws Exception {
		ger.removerSala(id);
	}

	/**
	 * Retorna o iterador dos Objetos que implementam Alocavel contidos no Gerenciador
	 * @return
	 */
	public Iterator<Alocavel> iteraAlocavel() {
		return ger.iteraAlocavel();
	}

	/**
	 * Retorna o iterador dos Objetos que implementam Escalonavel contidos no Gerenciador
	 * @return
	 */
	public Iterator<Escalonavel> iteraEscalonavel() {
		return ger.iteraEscalonavel();
	}

	/**
	 * Encaminha para o Gerenciador a requisi��o para zerar as listas de eventos e salas.
	 */
	public void zerarSistema() {
		ger.zerarSistema();
	}

	/**
	 * Encaminha para a PersistenciFacade a requisi��o para zerar a persistencia.
	 */
	public void zerarPersistencia() {
		ger.zerarSistema();
		PersistenciaFacade.zerarPersistencia();

	}

	/**
	 * Encaminha para o Gerenciador a requisi��o para encerrar o sistema.
	 */
	public void encerrarSistema() {
		ger.encerrarSistema();
	}

	/**
	 * Retorna o Gerenciador da persisntecia caso ele j� tenha sido salvo, retorna um novo caso contr�rio.
	 * @return
	 */
	public Gerenciador initSystem() {
		return PersistenciaFacade.initSystem();
	}

	//isso vai sair daki quando adaptar o iterator a InterfaceTexto
	// Gabriel diz: N�o vai, n�o.
	public List<Escalonavel> getListaDeEventos() {
		
		return ger.getListaDeEventos();
	}

	//isso vai sair daki quando adaptar o iterator a InterfaceTexto
	//Gabriel diz: Tamb�m n�o.
	public List<Alocavel> getListaDeSalas() {
		
		return ger.getListaDeSalas();
	}
	
	/**
	 * Encaminha a tarefa de salvar o sistema na persistencia e depois de encerra-lo.
	 */
	public void menuSair() {
		try {
			PersistenciaFacade.gravaGerenciador(ger);
		} catch (Exception e) {

		}

		ger.encerrarSistema();
	}
}
